Package org.python.pydev.refactoring.ast.visitors.info

Source Code of org.python.pydev.refactoring.ast.visitors.info.ImportVisitor

/*
* Copyright (C) 2006, 2007  Dennis Hunziker, Ueli Kistler
* Copyright (C) 2007  Reto Schuettel, Robin Stocker
*
* IFS Institute for Software, HSR Rapperswil, Switzerland
*
*/

package org.python.pydev.refactoring.ast.visitors.info;

import java.util.ArrayList;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;

import org.python.pydev.parser.jython.SimpleNode;
import org.python.pydev.parser.jython.ast.Import;
import org.python.pydev.parser.jython.ast.ImportFrom;
import org.python.pydev.parser.jython.ast.Module;
import org.python.pydev.parser.jython.ast.NameTok;
import org.python.pydev.parser.jython.ast.VisitorBase;
import org.python.pydev.parser.jython.ast.aliasType;
import org.python.pydev.refactoring.ast.FQIdentifier;

/**
* This visitor will resolve module aliases to real module names and also map alias identifiers to real identifier. For the last mapping
* list, key consists of "modulename.identifier"
*
*/
public class ImportVisitor extends VisitorBase {

    private SortedMap<String, String> importedModules;

    private List<FQIdentifier> aliasToFQIdentifier;

    public ImportVisitor() {
        importedModules = new TreeMap<String, String>();
        aliasToFQIdentifier = new ArrayList<FQIdentifier>();
    }

    @Override
    public void traverse(SimpleNode node) throws Exception {
        // ignore
    }

    @Override
    public Object visitImport(Import node) throws Exception {
        visitImportModules(node.names);
        return null;
    }

    private void visitImportModules(aliasType[] names) {
        for (aliasType alias : names) {
            NameTok name = (NameTok) alias.name;
            NameTok asName = (NameTok) alias.asname;

            String realName = name.id;
            String aliasName = name.id;
            if (asName != null) {
                aliasName = asName.id;
            }

            addModuleImport(aliasName, realName);
        }

    }

    @Override
    public Object visitImportFrom(ImportFrom node) throws Exception {
        NameTok moduleName = (NameTok) node.module;

        visitAlias(moduleName.id, node.names);
        return null;
    }

    private void visitAlias(String prefix, aliasType[] names) {
        if (names != null && names.length > 0) {
            for (aliasType alias : names) {
                NameTok name = (NameTok) alias.name;
                NameTok asName = (NameTok) alias.asname;

                String realName = name.id;
                String aliasName = name.id;
                if (asName != null) {
                    aliasName = asName.id;
                }

                aliasToFQIdentifier.add(new FQIdentifier(prefix, realName, aliasName));

            }
        } else {
            // from <smthing> import *
            importedModules.put(prefix, prefix);
        }
    }

    private void addModuleImport(String moduleAlias, String realName) {
        if (!(importedModules.containsKey(moduleAlias))) {
            importedModules.put(moduleAlias, realName);
        }
    }

    @Override
    protected Object unhandled_node(SimpleNode node) throws Exception {
        return null;
    }

    @Override
    public Object visitModule(Module node) throws Exception {
        node.traverse(this);
        return null;
    }

    public List<FQIdentifier> getAliasToFQIdentifier() {
        return aliasToFQIdentifier;
    }

    public SortedMap<String, String> getImportedModules() {
        return importedModules;
    }

}
TOP

Related Classes of org.python.pydev.refactoring.ast.visitors.info.ImportVisitor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.